#ifndef COMMON_H
#define COMMON_H

#include <NvInfer.h>

#include <functional>
#include <numeric>

template <typename A, typename B>
inline A div_up(A x, B n) {
  return (x + n - 1) / n;
}

inline int64_t volume(const nvinfer1::Dims& d) {
  return std::accumulate(d.d, d.d + d.nbDims, 1, std::multiplies<int>());
}

inline uint32_t get_nv_data_type_size(const nvinfer1::DataType type) {
  switch (type) {
    case nvinfer1::DataType::kINT32:
      return 4;
    case nvinfer1::DataType::kFLOAT:
      return 4;
    case nvinfer1::DataType::kHALF:
      return 2;
    case nvinfer1::DataType::kBOOL:
    case nvinfer1::DataType::kINT8:
      return 1;
  }
  return 0;
}

#endif /* #ifndef COMMON_H */
